package com.sky.service.impl;


import cn.mybatis.mp.core.mybatis.mapper.context.Pager;
import cn.mybatis.mp.core.sql.executor.chain.QueryChain;
import com.sky.entity.ScriptTagRelations;
import com.sky.entity.Tags;
import com.sky.exception.BaseException;
import com.sky.mapper.TagsMapper;
import com.sky.service.ScriptTagRelationsService;
import com.sky.service.TagsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author majun
 * @package com.sky.service.impl
 * @date 2025/6/21 12:21
 */
@Service
public class TagsServiceImpl implements TagsService {

    @Autowired
    private TagsMapper tagsMapper;

    @Autowired
    private ScriptTagRelationsService scriptTagRelationsService;

    /**
     * 保存标签
     *
     * @param tags 标签
     */
    public void save(Tags tags) {

        if (tags.getName().isEmpty() || tags.getSortOrder() == null) {
            throw new BaseException("参数缺失");
        }

        Tags tags1 = QueryChain.of(tagsMapper)
                .eq(Tags::getName, tags.getName())
                .get();

        if (tags1 != null) {
            throw new BaseException("标签已存在");
        }

        tagsMapper.save(tags);

    }

    /**
     * 按排序获取所有标签名称
     *
     * @return 标签名称列表
     */
    public List<String> getTagsName() {

        List<Tags> tags = QueryChain.of(tagsMapper)
                .orderBy(Tags::getSortOrder)
                .list();

        return tags.stream()
                .map(Tags::getName)
                .toList();

    }

    /**
     * 更新标签
     *
     * @param tags 标签
     */
    public void upDataTags(Tags tags) {

        tagsMapper.update(tags);

    }

    /**
     * 删除标签
     *
     * @param id 标签id
     */
    public void DeleteTags(String id) {

        Tags tags = tagsMapper.getById(id);

        if (tags == null || tags.getName().isEmpty()) {
            throw new BaseException("标签不存在");
        }
        // 查询标签和脚本的关联
        ScriptTagRelations scriptTagRelationsService1 = scriptTagRelationsService.getByTagId(Long.valueOf(id));

        if (scriptTagRelationsService1 != null) {
            throw new BaseException("该标签下有剧本，请先删除关联剧本");
        }

        tagsMapper.deleteById(id);

    }

    /**
     * 根据id查询标签
     *
     * @param id 标签id
     * @return 标签
     */
    public Tags getTagsById(Long id) {
        return tagsMapper.getById(id);
    }

    /**
     * 根据名称精确获取标签
     *
     * @param name 标签名称
     * @return 标签
     */
    public Tags getTagsByNameExact(String name) {
        return QueryChain.of(tagsMapper)
                .eq(Tags::getName, name)
                .get();
    }

    /**
     * 获取前7个标签名称
     *
     * @return 标签名称
     */
    public List<String> getScriptTagNames() {
        List<Tags> tags = QueryChain.of(tagsMapper)
                .orderBy(Tags::getSortOrder)
                .limit(7)
                .list();

        return tags.stream()
                .map(Tags::getName)
                .toList();
    }

    /**
     * 根据标签名称查询标签
     * @param name 标签名
     * @return 标签名称列表
     */
    public List<String> getTagsByName(String name) {
        List<Tags> tags = QueryChain.of(tagsMapper)
                .like(Tags::getName, name)
                .ignoreEmptyInCondition(true)
                .ignoreNullValueInCondition(true)
                .trimStringInCondition(true)
                .list();
        
        return tags.stream()
                .map(Tags::getName)
                .toList();
    }

    /**
     * 获取标签名称
     * @param name 标签名
     * @param page 页码
     * @param pageSize 每页数量
     * @return 响应结果
     */
    public Pager<Tags> getTagsPage(String name, Integer page, Integer pageSize) {
        return QueryChain.of(tagsMapper)
                .ignoreNullValueInCondition(true)
                .ignoreEmptyInCondition(true)
                .trimStringInCondition(true)
                .like(Tags::getName, name)
                .paging(Pager.of(page, pageSize));
    }
}
